home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / snz128s / src / getch.c < prev    next >
C/C++ Source or Header  |  1994-04-13  |  2KB  |  115 lines

  1. /*
  2. $Id: GETCH.C,v 1.2 1994/02/05 18:46:56 gbj Exp user $
  3. */
  4.  
  5. /*
  6. $Log: GETCH.C,v $
  7. // Revision 1.2  1994/02/05  18:46:56  gbj
  8. // Beta release
  9. //
  10. // Revision 1.1  1994/01/30  17:23:24  gbj
  11. // Initial revision
  12. //
  13. */
  14.  
  15. //#define TEST
  16.  
  17. //================================================================
  18. //
  19. //    Replace standard getch() so that the nasty PC keys can be
  20. //    simulated.
  21. //
  22. //    Does not deal with every possible scan code.
  23. //
  24. //    PC Translations:
  25. //
  26. //    PC            Value            ATARI        VALUE    ==>    
  27. //
  28. //    PGUP        0x49            sUP            0x4838        0x4900
  29. //    PGDN        0x51            sDN            0x5032        0x5100
  30. //    END            0x4f            sHOME        0x4737        0x4f00
  31. //    F1 (help)    0x3b            HELP        0x6200        0x3b00
  32. //
  33. //================================================================
  34.  
  35. #include <osbind.h>
  36.  
  37. static int next_char=0;
  38.  
  39. int getch(void)
  40. {
  41.     long x;
  42.     int scan_code, ascii_code;
  43.     int debug_next_char;
  44.     
  45.     // If a pending character, return it
  46.     if (next_char)
  47.     {
  48.         ascii_code=next_char;
  49.         next_char=0;
  50.         debug_next_char=next_char;
  51.         return ascii_code;
  52.     }
  53.     
  54.     // Get the next kepress and set up ascii_code and scan_code
  55.     x=Cnecin();
  56.     ascii_code=x&0x000000ff;
  57.     scan_code=(x&0x00ff0000)>>16;
  58.     
  59.     // Now, if ascii_code is 0, we already have one of the standard
  60.     // extended characters, so set next_char from scan_code, return 0.
  61.     // But, check for HELP key and translate to F1
  62.     
  63.     if (!ascii_code)
  64.     {
  65.         next_char=scan_code&0xff;
  66.         debug_next_char=next_char;
  67.         if (scan_code == 0x62)        //    HELP
  68.         {
  69.             next_char=0x3b;            //        to F1
  70.             debug_next_char=next_char;
  71.         }
  72.         return ascii_code;
  73.     }
  74.     
  75.     // Right, we have a possible funny character
  76.     // If it is a normal char, set next_char to NULL and return ascii_code.
  77.     // Otherwise, if it is one we are interested in, return NULL and
  78.     // set next_char as necessary.
  79.     
  80.     if (scan_code == 0x48)            // sUP to PGUP
  81.     {
  82.         ascii_code=0;
  83.         next_char=0x49;
  84.         debug_next_char=next_char;
  85.     }
  86.     else if (scan_code == 0x50)        // sDN to PGDN
  87.     {
  88.         ascii_code=0;
  89.         next_char=0x51;
  90.         debug_next_char=next_char;
  91.     }
  92.     else if (scan_code == 0x47)        // sHOME to END
  93.     {
  94.         ascii_code=0;
  95.         next_char=0x4f;
  96.         debug_next_char=next_char;
  97.     }
  98.     else                            // Not interested in it
  99.     {
  100.         next_char=0;
  101.         debug_next_char=next_char;
  102.     }
  103.     return ascii_code;
  104. }
  105.  
  106. #ifdef TEST
  107. void main(void)
  108. {
  109.     int c;
  110.     
  111.     while ((c=getch()) != '*')
  112.         printf("%2x  ", c);
  113.     exit(0);
  114. }
  115. #endif